#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：api_testing 
@File    ：extract_data_handle.py
@IDE     ：PyCharm 
@Author  ：future76
@Date    ：2024/6/26 9:26 
@Desc    ：提取数据的一些方法
"""
# 标准库导入
import json
from urllib.parse import unquote
# 第三方库导入
from jsonpath import jsonpath
from loguru import logger
# 本地应用/模块导入
from common.path_config import CASEFILES, CASEDATADIR


def json_extractor(obj, expr: str = '.'):
    """
        从目标对象obj, 根据表达式expr提取指定的值

        :param obj :json/dict类型数据
        :param expr: 表达式, . 提取字典所有内容， $.test_api_case 提取一级字典case， $.test_api_case.data 提取case字典下的data
        :return result: 提取的结果，未提取到返回 None
        """
    try:
        # 判断对应的变量是不是字符串格式
        if isinstance(obj, str):
            '''如果是字符串，就转成JSON 格式的字符串转换为 Python 对象。'''
            try:
                obj = json.loads(obj)
            except json.JSONDecodeError as err:
                logger.debug(f"JSON解码错误: {err}")
        # Python中的三元条件表达式,如果找到了一个精确的匹配项，那么将这个列表的第一个元素（索引为0的元素）赋值给变量result
        # 如果没有找到精确的一个匹配项（即列表长度不是1），那么将整个匹配结果列表赋值给变量result
        result = jsonpath(obj, expr)[0] if len(jsonpath(obj, expr)) == 1 else jsonpath(obj, expr)
        logger.debug(f"\n提取对象：{obj}\n"
                     f"提取表达式： {expr} \n"
                     f"提取值类型： {type(result)}\n"
                     f"提取值：{result}")
        return result
    except Exception as e:
        logger.debug(f"\n提取对象：{obj}\n"
                     f"提取表达式： {expr}\n"
                     f"提取对象： {obj}\n"
                     f"错误信息：{e}")


def response_extract(CaseData, res, all_var: dict):
    """
    提取响应之后的数据

    :param CaseData: 当前的Case，主要获取需要提取数据的字段：jsonExData
    :param res: 响应得到的对应的结果
    :param all_var: 全局变量，存储提取的数据给下条用例使用
    :return:
    """
    logger.info("\n开始提取数据--------------------------------------------------------")
    if not CaseData:
        logger.info("\n数据为空，该条用例无需提取！\n当前用例执行完成--------------------------------------------------------\n\n\n")
        return
    try:
        if CaseData:
            Exdata = eval(CaseData)  # {"VAR_TOKEN":"$..token"}
            logger.info(f"\n需要提取的数据：{Exdata}")
            for key, value in Exdata.items():
                # 通过对应的jsonpath获取具体的数据
                # todo res.text有修改，原先是res.json()
                new_value = json_extractor(res.text, value)
                all_var.update(
                    {key: new_value}
                )
            logger.info(f"\n提取出来的数据：{all_var}")
    except Exception as e:
        logger.error(f"\n请检查你需要提取数据数据格式的正确性。{e}")
    finally:
        logger.info("\n当前用例执行完成--------------------------------------------------------\n\n\n")


def convert_to_dict(s):
    d = s.split("&")
    data = {}
    for e in d:
        if "=" in e:
            da = e.split("=", 1)  # 只分割第一次出现的等号
            data[unquote(da[0])] = unquote(da[1]) if len(da) > 1 else None
        else:
            data[unquote(e)] = None  # 处理没有值的字段
    return data


def switch_case():
    """
    根据CASEFILES的存在与否，决定API请求的目标和文件路径。

    :return: 一个包含target和appoint_file的元组。
    """
    if CASEFILES:
        target = CASEDATADIR
        appoint_file = CASEFILES  # 修正了变量名的拼写
    else:
        target = CASEDATADIR
        appoint_file = None

    return target, appoint_file



if __name__ == '__main__':
    obj = '{"id": 1, "user_id": 102, "action": "autologin", "value": "3734462a398eedd9ab7448c4e2880ddd3f9bb2cb","a":{"id":111}}'
    expre = "'user_id': (.*?),"

    aa = json.loads(obj)

    res = json_extractor(obj,expr="$.id")
    print(res)
    # print(jsonpath(obj,"$.a.id" ))
    print(aa)
    print(type(aa))

